package com.mindskip.xzs.controller;
//这段代码定义了一个自定义的错误处理控制器，用于处理Spring Boot应用中的错误和异常情况。
//统一错误响应格式：
//前端应用在与后端进行交互时，可能会遇到各种错误和异常情况。通过这个自定义的错误处理控制器，前端可以获得一个统一格式的错误响应，便于处理和显示。响应包含统一的错误代码和错误信息，便于前端根据错误代码进行相应处理。
//错误提示用户友好：
//通过返回统一的错误信息，前端可以更好地向用户展示错误提示，提升用户体验。例如，当发生服务器内部错误时，可以显示一个通用的错误提示信息，而不暴露具体的实现细节。
//减少前端处理复杂性：
//前端不需要处理各种不同错误响应，只需处理一种统一格式的错误响应即可，减少了代码的复杂性和维护成本。
//集中处理错误：
//此控制器继承自BasicErrorController，集中处理了所有的错误和异常情况。通过覆盖默认的错误响应，提供了自定义的错误响应格式。
//简化错误处理逻辑：
//后端开发人员不需要在每个控制器中处理错误和异常，通过定义统一的错误控制器，简化了错误处理逻辑。任何未捕获的异常都会被这个控制器捕获并处理。
//提高代码可维护性：
//集中管理错误处理逻辑，提高了代码的可维护性和一致性。任何错误响应的修改只需在一个地方进行，而不需要修改所有的控制器。
import com.mindskip.xzs.base.SystemCode;
import org.springframework.boot.autoconfigure.web.ErrorProperties;
import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController;
import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**使用 @RestController 注解标识这是一个 RESTful 控制器*/
@RestController
public class ErrorController extends BasicErrorController {

    // 定义错误路径常量
    private static final String PATH = "/error";

    // 构造方法，调用父类构造方法，传入默认错误属性和错误属性配置
    public ErrorController() {
        super(new DefaultErrorAttributes(), new ErrorProperties());
    }

    // 使用 @RequestMapping 注解映射请求路径，并指定响应类型为 JSON
    @RequestMapping(produces = {MediaType.APPLICATION_JSON_VALUE})
    @ResponseBody
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        // 创建一个包含错误信息的 Map
        Map<String, Object> error = new HashMap<>(2);
        // 放入错误代码
        error.put("code", SystemCode.InnerError.getCode());
        // 放入错误信息
        error.put("message", SystemCode.InnerError.getMessage());
        // 返回包含错误信息的 ResponseEntity，HTTP 状态为 200 OK
        return new ResponseEntity<>(error, HttpStatus.OK);
    }

    // 重写 getErrorPath 方法，返回错误路径
    @Override
    public String getErrorPath() {
        return PATH;
    }
}